"""
语言本地化工具模块
提供加载语言包和获取本地化文本的功能
"""

import json
import os
from typing import Dict, Any, Optional

class I18n:
    """语言本地化类"""
    
    def __init__(self, lang_dir: str = "languages", default_lang: str = "zh"):
        """
        初始化语言本地化类
        
        Args:
            lang_dir: 语言包目录路径
            default_lang: 默认语言代码
        """
        self.lang_dir = lang_dir
        self.default_lang = default_lang
        self.current_lang = default_lang
        self.languages: Dict[str, Dict[str, Any]] = {}
        self.available_languages: Dict[str, str] = {
            "zh": "简体中文",
            "en": "English"
        }
        
        # 加载所有可用的语言包
        self._load_languages()
    
    def _load_languages(self) -> None:
        """加载所有语言包文件"""
        if not os.path.exists(self.lang_dir):
            raise FileNotFoundError(f"Language directory not found: {self.lang_dir}")
        
        # 遍历语言包目录
        for filename in os.listdir(self.lang_dir):
            if filename.endswith('.json'):
                lang_code = filename[:-5]  # 移除.json后缀
                lang_path = os.path.join(self.lang_dir, filename)
                
                try:
                    with open(lang_path, 'r', encoding='utf-8') as f:
                        self.languages[lang_code] = json.load(f)
                except Exception as e:
                    print(f"Error loading language file {filename}: {str(e)}")
    
    def set_language(self, lang_code: str) -> bool:
        """
        设置当前语言
        
        Args:
            lang_code: 语言代码
            
        Returns:
            bool: 是否设置成功
        """
        if lang_code in self.languages:
            self.current_lang = lang_code
            return True
        return False
    
    def get_text(self, key: str, lang: Optional[str] = None) -> str:
        """
        获取指定键的本地化文本
        
        Args:
            key: 文本键，使用点号分隔的路径，如 'home.buttons.save'
            lang: 可选的语言代码，如果未指定则使用当前语言
            
        Returns:
            str: 本地化文本，如果未找到则返回键名
        """
        # 使用指定的语言或当前语言
        lang_code = lang or self.current_lang
        
        # 如果语言不存在，使用默认语言
        if lang_code not in self.languages:
            lang_code = self.default_lang
        
        # 获取语言包
        lang_data = self.languages[lang_code]
        
        # 按路径查找文本
        keys = key.split('.')
        value = lang_data
        
        try:
            for k in keys:
                value = value[k]
            
            if isinstance(value, str):
                return value
            else:
                return key
        except (KeyError, TypeError):
            # 如果在当前语言中未找到，尝试在默认语言中查找
            if lang_code != self.default_lang:
                return self.get_text(key, self.default_lang)
            return key
    
    def get_languages(self) -> Dict[str, str]:
        """
        获取所有可用的语言
        
        Returns:
            Dict[str, str]: 语言代码和语言名称的映射
        """
        return self.available_languages
    
    def get_current_language(self) -> str:
        """
        获取当前语言代码
        
        Returns:
            str: 当前语言代码
        """
        return self.current_lang
    
    def format_text(self, key: str, **kwargs: Any) -> str:
        """
        获取并格式化本地化文本
        
        Args:
            key: 文本键
            **kwargs: 格式化参数
            
        Returns:
            str: 格式化后的本地化文本
        """
        text = self.get_text(key)
        try:
            return text.format(**kwargs)
        except (KeyError, ValueError):
            return text

# 创建全局实例
i18n = I18n()

def init_i18n(lang_dir: str = "languages", default_lang: str = "zh") -> I18n:
    """
    初始化全局语言实例
    
    Args:
        lang_dir: 语言包目录路径
        default_lang: 默认语言代码
        
    Returns:
        I18n: 语言实例
    """
    global i18n
    i18n = I18n(lang_dir, default_lang)
    return i18n

def get_text(key: str, **kwargs: Any) -> str:
    """
    获取本地化文本的快捷方法
    
    Args:
        key: 文本键
        **kwargs: 格式化参数
        
    Returns:
        str: 本地化文本
    """
    return i18n.format_text(key, **kwargs)

def set_language(lang_code: str) -> bool:
    """
    设置当前语言的快捷方法
    
    Args:
        lang_code: 语言代码
        
    Returns:
        bool: 是否设置成功
    """
    return i18n.set_language(lang_code)

def get_languages() -> Dict[str, str]:
    """
    获取所有可用语言的快捷方法
    
    Returns:
        Dict[str, str]: 语言代码和语言名称的映射
    """
    return i18n.get_languages()

def get_current_language() -> str:
    """
    获取当前语言代码的快捷方法
    
    Returns:
        str: 当前语言代码
    """
    return i18n.get_current_language()